package com.gxc.array;

import java.util.*;

/**
 * 现有两个整数数组，需要你找出两个数组中同时出现的整数，并按照如下要求输出:有同时出现的整数时，先按照同时出现次数（整数在两个数组中都出现并目出现次数较少的那个）进行归类，然后按照出现次数从小到大依次按行输出。 没有同时出现的整数时，输出NULL.
 *
 * 输入描述
 * 第一行为第一个整数数组，第二行为第二个整数数组，每行数中整数与整数之间以英文号分，整数的取值范用为[-200, 200]，数组长度的范用为[1, 10000]之间的整数.
 *
 *
 *
 * 输出描述
 * 按照出现次数从小到大依次按行输出，每行输出的格式为：
 *
 * 出现次数:该出现次数下的整数升序排序的结果
 *
 * 格式中的":"为英文冒号，整数间以英文逗号分隔
 */
public class SameTime {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Map<Integer, Integer> aMap = buildMap(scanner.nextLine());
        Map<Integer, Integer> bMap = buildMap(scanner.nextLine());
        scanner.close();

        Map<Integer, Set<Integer>> res = handle(aMap, bMap);
        if (res.isEmpty()) {
            System.out.println("NULL");
        } else {
            for (Map.Entry<Integer, Set<Integer>> entry : res.entrySet()) {
                System.out.print(entry.getKey() + ":");
                System.out.println(String.join(",", entry.getValue().stream().map(String::valueOf).toArray(String[]::new)));;
            }
        }

    }

    private static Map<Integer, Set<Integer>> handle( Map<Integer, Integer> aMap,  Map<Integer, Integer> bMap) {
        Map<Integer, Set<Integer>> tree = new TreeMap<>();
        for (Map.Entry<Integer, Integer> entry : bMap.entrySet()) {
            if (aMap.containsKey(entry.getKey())) {
                int min = Math.min(entry.getValue(), aMap.get(entry.getKey()));
                tree.computeIfAbsent(min, v -> new TreeSet<>()).add(entry.getKey());
            }
        }
        return tree;
    }

    private static Map<Integer, Integer> buildMap(String str) {
        Map<Integer, Integer> map = new HashMap<>();
        String[] split = str.split(",");
        for (int i = 0; i < split.length; i++) {
            int n = Integer.parseInt(split[i]);
            map.put(n, map.getOrDefault(n , 0) + 1);
        }
        return map;
    }
}
